import numpy as np
import pandas as pd
import os
import shutil


def generate_simulation_data(record_row=100, local=False):
    """
    从1-80的数字序列中随机选取20个数字，生成100组数据
    参数：
    record_row 使用多少行数据
    local 使用 output.csv 历史数据文件 还是随机生成
    Returns:
        data_matrix: 100*20的数组，包含所有选取的数字
        record_matrix: 100*80的记录数组，标记每个数字是否出现
    """
    N = record_row  # 生成100组数据
    data_matrix = np.zeros((N, 20), dtype=int)
    data_matrix_all = np.zeros((N, 21), dtype=int)  # 记录所有数字的出现情况
    if local:
        # 读取数据
        data_matrix_all = pd.read_csv('output.csv').to_numpy()
        data_matrix_all = data_matrix_all[-record_row:]

        data_matrix = pd.read_csv('output.csv').drop(columns='code').to_numpy()
        data_matrix = data_matrix[-record_row:]
        N = data_matrix.shape[0]
        record_matrix = np.zeros((N, 80), dtype=int)

    else:
        # np.random.seed(42) # 设置随机数种子，确保结果可复现
        record_matrix = np.zeros((N, 80), dtype=int)
        for i in range(N):
            # 从1-80中随机选择20个不重复的数字
            selected_numbers = np.random.choice(range(1, 81), size=20, replace=False)
            selected_numbers.sort()  # 排序，便于查看
            data_matrix[i] = selected_numbers
        

    for i in range(N):
        # 更新记录矩阵
        for num in data_matrix[i]:
            record_matrix[i, num-1] = 1  # 数字1-80对应索引0-79

    return data_matrix_all, data_matrix, record_matrix

def continuous_data(record_matrix, input_ratio=6, output_ratio=10):
    """ 分析record_matrix 中连续出现的次数，
    生成一个新的矩阵，记录每个数字连续未出现的次数
    例如：连续未出现N行的数字在矩阵中对应的值为N
         连续出现 N >= input_ratio 开始 ratio 跟进
         连续出现 N > output_ratio 结束 ratio 退出跟进
    """
    continuous_matrix = np.zeros((record_matrix.shape[0], 80), dtype=int)  # 连续未出现的记录 
    input_matrix = np.zeros((record_matrix.shape[0], 80), dtype=int)  # input 跟进记录 投倍情况
    input_m_matrix = np.zeros((record_matrix.shape[0], 80), dtype=int)  # input m 
    hit_matrix = np.zeros((record_matrix.shape[0], 80), dtype=int)  # hit 记录 投中倍数
    hit_m_matrix = np.zeros((record_matrix.shape[0], 80), dtype=int)  # hit m

    continuous_matrix[0] = 1 - record_matrix[0]  # 第一行为1的设置为0，为0的设置为1
    for i in range(1, record_matrix.shape[0]):  # 从第二行开始 1~99
        for j in range(80):
            # 记录连续
            if record_matrix[i, j] == 0:
                continuous_matrix[i, j] = continuous_matrix[i-1, j] + 1
            else:
                continuous_matrix[i, j] = 0
            # 计算本次投入
            # 上一次 大于5 就投入，小于 output_ratio 就不投入
            if continuous_matrix[i-1, j] >= input_ratio and continuous_matrix[i-1, j] < output_ratio:  
                # 持续投入的情况，当前一定是未hit
                input_matrix[i, j] = input_matrix[i-1, j] + 1
            else:
                # 当前高于最大，不再投入了 一定不中的
                input_matrix[i, j] = 0
            
            # 计算本次中奖， 
            # 有投入才看是否中
            # record_matrix 记录 =1 中
            if input_matrix[i, j] > 0 and record_matrix[i, j] == 1:
                hit_matrix[i, j] = input_matrix[i, j]
           


    input_m_matrix = np.where(input_matrix != 0, 2 ** input_matrix, 0)  # input_matrix 中非0的值取平方
    hit_m_matrix = np.where(hit_matrix != 0, (2 ** hit_matrix) / 2 * 4.6, 0)  # hit_matrix 中非0的值取平方

    return continuous_matrix, input_matrix, hit_matrix, input_m_matrix, hit_m_matrix

def generate_input_output_data(record_row=100, input_ratio=6, output_ratio=100, local=False):
    """ 生成数据。 record_row,input_ratio,output_ratio, hit_m
    参数：
    record_row:多少期号码
    input_ratio: 跟入倍率
    output_ratio: 退出倍率
    local 使用 output.csv 历史数据文件 还是随机生成
    """
    generate_data = np.zeros((record_row, 7), dtype=float)
    
    # 将 generate_data 第一列全部设置为 record_row 的值
    generate_data[:, 1] = record_row
    # 将 generate_data 第二列全部设置为 input_ratio 的值
    generate_data[:, 2] = input_ratio
    # 将 generate_data 第三列全部设置为 output_ratio 的值
    generate_data[:, 3] = output_ratio
    data_matrix_all, data_matrix, record_matrix = generate_simulation_data(record_row,local)
    continuous_matrix, input_matrix, hit_matrix, input_m_matrix, hit_m_matrix = continuous_data(record_matrix, input_ratio, output_ratio)

    # 加入记录一下 日期
    generate_data[:, 0] = data_matrix_all[:, 0]
    # 第4列赋值 input_m_matrix
    generate_data[:, 4] = np.round(input_m_matrix.sum(axis=1),2)
    # 第5列赋值 hit_m_matrix
    generate_data[:, 5] = np.round(hit_m_matrix.sum(axis=1),2)

    generate_data[:, 6] = np.round(generate_data[:, 5] - generate_data[:, 4],2)
    save_to_csv(data_matrix_all,'data_matrix_all.csv')
    save_to_csv(data_matrix,'data_matrix.csv')
    save_to_csv(record_matrix,'record_matrix.csv')
    save_to_csv(continuous_matrix,'continuous_matrix.csv')
    save_to_csv(input_matrix,'input_matrix.csv')
    save_to_csv(hit_matrix,'hit_matrix.csv')
    save_to_csv(input_m_matrix,'input_m_matrix.csv')
    save_to_csv(hit_m_matrix,'hit_m_matrix.csv')
    return generate_data

def save_to_csv(data, file_path='output_t.csv'):
    try:
        df = pd.DataFrame(data)
        df.to_csv(file_path, mode='a', header=not pd.io.common.file_exists(file_path), index=False)
        print(f"数据已成功追加到 {file_path}")
    except Exception as e:
        print(f"保存数据到 CSV 文件时出错: {e}")

def main():
    print("开始生成模拟数据...")
    generate_row = 350
    generate_data = generate_input_output_data(generate_row, 5, 10, False)
    save_to_csv(generate_data, 'output_s.csv')
    generate_data_t = np.zeros((generate_row, 7), dtype=float)
    # 从第二行开始处理
    for i in range(1, generate_data.shape[0]):
        generate_data_t[i, 0] = generate_data[i, 0]
        generate_data_t[i, 1] = generate_data[i, 1]
        generate_data_t[i, 2] = generate_data[i, 2]
        generate_data_t[i, 3] = generate_data[i, 3]
        generate_data_t[i, 4] = np.round(np.sum(generate_data[:i + 1, 4]), 2)
        generate_data_t[i, 5] = np.round(np.sum(generate_data[:i + 1, 5]), 2)
        generate_data_t[i, 6] = np.round(np.sum(generate_data[:i + 1, 6]), 2)
    save_to_csv(generate_data_t, 'output_t.csv')


def delete_files_in_folder(folder_path):
    try:
        # 遍历文件夹下的所有内容
        for root, dirs, files in os.walk(folder_path):
            for file in files:
                file_path = os.path.join(root, file)
                # 删除文件
                os.remove(file_path)
            for dir in dirs:
                dir_path = os.path.join(root, dir)
                # 删除子文件夹
                shutil.rmtree(dir_path)
        print(f"文件夹 {folder_path} 下的所有文件和子文件夹已成功删除。")
    except FileNotFoundError:
        print(f"错误: 文件夹 {folder_path} 未找到。")
    except Exception as e:
        print(f"错误: 发生了一个未知错误: {e}")
        
def copy_file_to_data(source_file_path):
    # 目标目录
    target_directory = 'data'

    # 检查 data 目录是否存在，如果不存在则创建
    if not os.path.exists(target_directory):
        os.makedirs(target_directory)

    try:
        # 获取源文件的文件名
        file_name = os.path.basename(source_file_path)
        # 构建目标文件的完整路径
        target_file_path = os.path.join(target_directory, file_name)
        # 复制文件
        shutil.copy2(source_file_path, target_file_path)
        print(f"文件 {source_file_path} 已成功复制到 {target_file_path}")
    except FileNotFoundError:
        print(f"错误: 源文件 {source_file_path} 未找到。")
    except Exception as e:
        print(f"错误: 发生了一个未知错误: {e}")

if __name__ == "__main__":
    # delete_files_in_folder('data')
    copy_file_to_data('output.csv')
    path = f'data'
    os.chdir(path)
    main()